/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __95E00AB0_890D_4D4D_B71E_9AFD2D465D8C__
#define __95E00AB0_890D_4D4D_B71E_9AFD2D465D8C__

#include <windows.h>
#include <shlwapi.h>

#if defined( _MSC_VER )
#pragma comment( lib, "shlwapi.lib" )
#endif

namespace xos_helper
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_strcpy
    // 
    static void xos_strcpy( char * lpszDest, const char * lpszSrc )
    {
        lstrcpyA( lpszDest, lpszSrc );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_strcat
    // 
    static void xos_strcat( char * lpszDest, const char * lpszSrc )
    {
        lstrcatA( lpszDest, lpszSrc );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_path_append
    // 
    static void xos_path_append( char * lpszPath, const char * lpszAdder )
    {
        PathAppendA( lpszPath, lpszAdder );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_get_process_path
    // 
    static int xos_get_process_path( char * pszPath, int nLen, int * pnLenNeeded )
    {
        int nRet = 0;

        char szFile[4096] = { 0 };

        ::GetModuleFileNameA( 0, szFile, sizeof( szFile ) / sizeof( szFile[0] ) );

        char * p = 0, * pp = szFile;

        while( *pp != 0 )
        {
            if( *pp == '\\' )
            {
                p = pp;
            }

            ++pp;
        }

        if( p )
        {
            *p = 0;
        }

        if( pszPath )
        {
            xos_strcpy( pszPath, szFile );
        }
        else
        {
            nRet = 1;
        }

        return nRet;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_load
    // 
    static int xos_load( const char * lpszFile, void* & pModule )
    {
        int nRet = 0;

        HMODULE hModule = 0;

        if( 0 == nRet )
        {
            hModule = LoadLibraryA( lpszFile );
            if( !hModule )
            {
                nRet = 1;
            }
        }

        if( 0 == nRet )
        {
            pModule = ( void* )hModule;
        }

        return nRet;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_free
    // 
    static int xos_free( void* & pModule )
    {
        int nRet = 0;

        if( pModule )
        {
            FreeLibrary( ( HMODULE )pModule );
            pModule = 0;
        }

        return nRet;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // xos_get_proc_by_name
    // 
    static int xos_get_proc_by_name( void ** ppv, void * pModule, const char * lpszProcName )
    {
        int nRet = 0;

        HMODULE hModule = ( HMODULE )pModule;
        void * pRet = 0;

        if( ( 0 == nRet ) && !hModule )
        {
            nRet = 1;
        }

        if( 0 == nRet )
        {
            pRet = (void*)GetProcAddress( hModule, lpszProcName );
            if( !pRet )
            {
                nRet = 1;
            }
        }

        if( 0 == nRet )
        {
            *ppv = pRet;
        }

        return nRet;
    }

} // xos_helper

#endif // __95E00AB0_890D_4D4D_B71E_9AFD2D465D8C__
